home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / os2 / pccts.zip / SET.H < prev    next >
C/C++ Source or Header  |  1992-12-08  |  3KB  |  109 lines

  1. /*    set.h
  2.  
  3.     The following is a general-purpose set library originally developed
  4.     by Hank Dietz and enhanced by Terence Parr to allow dynamic sets.
  5.     
  6.     Sets are now structs containing the #words in the set and
  7.     a pointer to the actual set words.
  8.  
  9.     1987 by Hank Dietz
  10.     
  11.     Modified by:
  12.         Terence Parr
  13.         Purdue University
  14.         October 1989
  15.  
  16.         Added ANSI prototyping Dec. 1992 -- TJP
  17. */
  18.  
  19. /* Define usable bits per unsigned int word */
  20. #ifdef PC
  21. #define WORDSIZE 16
  22. #define LogWordSize    4
  23. #else
  24. #define    WORDSIZE 32
  25. #define LogWordSize 5
  26. #endif
  27. #define BytesPerWord    sizeof(unsigned)
  28.  
  29. #define    SETSIZE(a) ((a).n<<LogWordSize)        /* Maximum items per set */
  30. #define    MODWORD(x) ((x) & (WORDSIZE-1))        /* x % WORDSIZE */
  31. #define    DIVWORD(x) ((x) >> LogWordSize)        /* x / WORDSIZE */
  32. #define    nil    ((unsigned) -1)        /* An impossible set member all bits on (big!) */
  33.  
  34. typedef struct {
  35.             unsigned int n;        /* Number of words in set */
  36.             unsigned *setword;
  37.         } set;
  38.  
  39. #define set_init    {0, NULL}
  40. #define set_null(a)    ((a).setword==NULL)
  41.  
  42. #define    NumBytes(x)        (((x)>>3)+1)                /* Num bytes to hold x */
  43. #define    NumWords(x)        (((x)>>LogWordSize)+1)        /* Num words to hold x */
  44.  
  45.  
  46. /* M a c r o s */
  47.  
  48. /* make arg1 a set big enough to hold max elem # of arg2 */
  49. #define set_new(a,max) \
  50. if (((a).setword=(unsigned *)calloc(NumWords(max),BytesPerWord))==NULL) \
  51.         fprintf(stderr, "set_new: Cannot allocate set with max of %d\n", max); \
  52.         (a).n = NumWords(max);
  53.  
  54. #define set_free(a)                                    \
  55.     {if ( (a).setword != NULL ) free((a).setword);    \
  56.     (a) = empty;}
  57.  
  58. #ifdef __STDC__
  59. extern void set_size( unsigned );
  60. extern unsigned int set_deg( set );
  61. extern set set_or( set, set );
  62. extern set set_and( set, set );
  63. extern set set_dif( set, set );
  64. extern set set_of( unsigned );
  65. extern void set_ext( set *, unsigned int );
  66. extern set set_not( set );
  67. extern int set_equ( set, set );
  68. extern int set_sub( set, set );
  69. extern unsigned set_int( set );
  70. extern int set_el( unsigned, set );
  71. extern int set_nil( set );
  72. extern char * set_str( set );
  73. extern set set_val( register char * );
  74. extern void set_orel( unsigned, set * );
  75. extern void set_orin( set *, set );
  76. extern void set_rm( unsigned, set );
  77. extern void set_clr( set );
  78. extern set set_dup( set );
  79. extern void set_PDQ( set, register unsigned * );
  80. extern unsigned *set_pdq( set );
  81. extern unsigned int set_hash( set, register unsigned int );
  82. #else
  83. extern void set_size();
  84. extern unsigned int set_deg();
  85. extern set set_or();
  86. extern set set_and();
  87. extern set set_dif();
  88. extern set set_of();
  89. extern void set_ext();
  90. extern set set_not();
  91. extern int set_equ();
  92. extern int set_sub();
  93. extern unsigned set_int();
  94. extern int set_el();
  95. extern int set_nil();
  96. extern char * set_str();
  97. extern set set_val();
  98. extern void set_orel();
  99. extern void set_orin();
  100. extern void set_rm();
  101. extern void set_clr();
  102. extern set set_dup();
  103. extern void set_PDQ();
  104. extern unsigned *set_pdq();
  105. extern unsigned int set_hash();
  106. #endif
  107.  
  108. extern set empty;
  109.